import bigDecimal from "js-big-decimal";

export default {
  // 声明
  state(number) {
    return new bigDecimal(number || 0);
  },
  // 加法运算
  add(number1, number2, precision = 2) {
    return this.round(bigDecimal.add(number1, number2), precision);
  },
  // 减法运算
  subtract(number1, number2, precision = 2) {
    return this.round(bigDecimal.subtract(number1, number2), precision);
  },
  // 乘法运算
  multiply(number1, number2, precision = 2) {
    return this.round(bigDecimal.multiply(number1, number2), precision);
  },
  // 除法运算
  // precision: 精确度，默认最多保留8位小数
  divide(number1, number2, precision = 2, precision2 = 8) {
    if (!number1 || !number2) {
      return 0;
    }
    // 添加number，移除小数末尾多余0
    return this.round(bigDecimal.divide(number1, number2, precision2), precision);
  },
  /**
   * 保留小数
   * length: 小数位长度，默认两位小数
   * option：选项，默认四舍五入
   *   HALF_EVEN 四舍五入
   *   CEILING 向上取
   *   DOWN 向下取
   */
  round(number, length = 2, option = "HALF_EVEN") {
    const num = new bigDecimal(number);
    return num.round(length, bigDecimal.RoundingModes[option]).getValue();
  },
  /**
   *这个函数首先将数字乘以2，然后进行四舍五入，最后再除以2得到结果。当乘以2之后，小数点后的数值大于或等于5时，四舍五入的规则会让它向上进一。其他情况都会结果为0.5。
   *
   * @param {*} number
   */
  roundHalfUp(number) {
    return bigDecimal.divide(this.round(bigDecimal.multiply(number, 2), 0, "CEILING"), 2, 1);
  },
  // 绝对值
  abs(number) {
    return bigDecimal.abs(number);
  },
  // 向上取整
  ceil(number) {
    return bigDecimal.ceil(number);
  },
  // 向下取整
  floor(number) {
    return bigDecimal.floor(number);
  }
};
